package pathtool

import (
	"fmt"
	"io/ioutil"
	"os"
	"path"
	"path/filepath"
	"strings"
)

// GetAllFile 获取一个路径的全部文件
// 若是目录，返回目录下的所有文件路径
// 若是文件，返回该文件本身路径
func GetAllFile(path string) ([]string, error) {
	if !IsDir(path) {
		result := []string{}
		result = append(result, path)
		return result, nil
	}

	result := []string{}

	fis, err := ioutil.ReadDir(path)
	if err != nil {
		fmt.Printf("读取文件目录失败，pathname=%v, err=%v \n", path, err)
		return result, err
	}

	for ind := range fis {
		fullname := path + "/" + fis[ind].Name()
		// 文件夹则递归进入获取；文件则压入结果
		if fis[ind].IsDir() {
			temp, err := GetAllFile(fullname)
			if err != nil {
				fmt.Printf("读取文件目录失败，fullname=%v, err=%v", fullname, err)
				return result, err
			}
			result = append(result, temp...)
		} else {
			result = append(result, fullname)
		}
	}
	return result, nil
}

// PriDic 获取path下所有一级目录列表（完整路径）
func PriDic(path string) ([]string, error) {
	res := []string{}
	if !IsDir(path) {
		return res, fmt.Errorf("路径非目录：[%v]", path)
	}

	fis, err := ioutil.ReadDir(path)
	if err != nil {
		return res, err
	}

	for ind := range fis {
		priPath := path + "/" + fis[ind].Name()
		if fis[ind].IsDir() {
			res = append(res, priPath)
		}
	}

	return res, nil
}

// PriPaths 获取path下所有一级文件/目录列表（完整路径）
func PriPaths(path string) ([]string, error) {
	res := []string{}
	if !IsDir(path) {
		return res, fmt.Errorf("路径非目录：[%v]", path)
	}

	fis, err := ioutil.ReadDir(path)
	if err != nil {
		return res, err
	}

	for ind := range fis {
		priPath := path + "/" + fis[ind].Name()
		res = append(res, priPath)
	}

	return res, nil
}

// IsDir 判断路径是否是目录
func IsDir(path string) bool {
	fl, err := os.Stat(path)
	if err != nil {
		return false
	}
	return fl.IsDir()
}

// Abs 将相对路径转换为绝对路径
func Abs(path string) (string, error) {
	if !filepath.IsAbs(path) {
		res, err := filepath.Abs(path)
		if err != nil {
			return res, err
		}
	}
	return path, nil
}

// Exists 获取路径的文件或目录是否存在
func Exists(path string) (bool, error) {
	_, err := os.Stat(path)
	if err == nil {
		return true, nil
	}
	if os.IsNotExist(err) {
		return false, nil
	}
	return false, err
}

// UnixStyle 将Windows风格的字符串转换为Unix风格的字符串
func UinxStyle(path string) string {
	res := strings.Replace(path, "\\", "/", -1)
	return res
}

func TrimSuffix(filename string) string {
	suffix := path.Ext(filename)
	filenameOnly := strings.TrimSuffix(filename, suffix)
	return filenameOnly
}
